package dataS.array;

public class CustomArray {
    private int[] array = null;
    //数组有效长度
    public int length = 0;

    //空参构造函数，默认数组大小为10
    public CustomArray() {
        this.array = new int[10];
    }

    public CustomArray(int size) {
        this.array = new int[size];
    }

    //给自定义数组添加元素
    public void insert(int number) {
        //判断数组是否满
        //满了，扩容,扩容需要新建一个数组，将旧的数据复制过去，再插入
        //没满，直接插入
        //插入之后length+1
        if (length == array.length) {
            expand(this.array);
            array[length] = number;
        } else {
            this.array[length] = number;
        }
        length++;

    }

    //根据索引删除元素
    public void deleteByIndex(int index) throws Exception {
        //判断索引是否越界，即超过了有效长度
        //超过了，抛出异常提示
        //没超过就删除
            //需要将该索引之后的所有元素前移一个位置。
            //最后length-1
        if (index > length - 1 || index < 0) {
            throw new Exception("删除时索引越界");
        } else {
            for (int i = index; i < length; i++) {
                array[i] = array[i + 1];
            }
            length--;
        }
    }

    //根据值删除元素，删除多个
    public void deleteByValue(int value) throws Exception {
        //边扫描边统计不等于value的数，并将不等于value的前移到count位置,最后修改有效元素个数
       //1，2，3，3，3，4
        int count=0;
        for (int i = 0; i < length; i++) {
            if(array[i]!=value){
                array[count]=array[i];
                count++;
            }
        }
        length=count;

    }

    //根据值删除符合条件的第一个元素
    public void deleteOne(int value) throws Exception {
        boolean flag = false;
        for (int i = 0; i < length; i++) {
            if (array[i] == value) {
                flag = true;
                deleteByIndex(i);
                break;
            }
        }
        if (!flag)
            throw new Exception("该元素不存在");

    }


    //修改某索引对应元素的值
    public void update(int index, int value) throws Exception {
        if (index > length - 1 || index < 0) {
            throw new Exception("修改时索引越界");
        } else {
            array[index] = value;
        }
    }

    //（遍历）数组的元素
    public void travel() {
        System.out.print("[");
        for (int i = 0; i < length; i++) {
            System.out.print(array[i]);
            if (i < length - 1)
                System.out.print(",");
        }
        System.out.println("]");
    }

    //根据值查找元素，返回符合条件的第一个元素的索引
    public int search(int value) throws Exception {
        int i = 0;
        for (i = 0; i < length; i++) {
            if (value == array[i])
                break;
        }
        if (i == length)
            return -1;
        return i;
    }
    //根据索引元素，返回值
    public int searchByIndex(int index) throws Exception {
        if(index<0||index>=length){
            throw new Exception("索引越界");
        }
        return array[index];

    }

    //每次扩容后比之前大一倍
    public void expand(int[] arr) {
        int expandSize = arr.length * 2;
        this.array = new int[expandSize];

        for (int i = 0; i < arr.length; i++) {
            this.array[i] = arr[i];
        }
//        System.arraycopy(arr,0,array,0,length);
    }


}
